/**
  *  isArray,
  *  deepCopy,
  *  findIndex,
  *  debounce,
  * formatDate,
  * formatGender
 */


const isArray = (obj)=>{  
    return Object.prototype.toString.call(obj) === '[object Array]';   
}
//对象深拷贝
const deepCopy = (source) =>{ 
    let type = typeof source;
    if(type=="string" || type=="number" || type=="boolean" || source===null) return source;
    let result = isArray(source)?[]:{};
    for (var key in source) {
        result[key] = typeof source[key]==='object'? deepCopy(source[key]): source[key];
    } 
    return result; 
}
//找出对象在集合中的索引 0开始
const findIndex = (collection,obj)=>{
    var len = collection.length;
    var type = typeof obj;
    if(type=='string'|| type=='number' || type=="boolean"){
        for(let i=0;i<len;i++ ){
            var item = collection[i]
            if(item.value==obj) return i;
        }
        return -1;
    }
    for(var i=0; i<len; i++){
      var item = collection[i];
      var flg = true;
      for(var k in obj){
        if(obj[k]!=item[k]){
          flg = false;
        }
      }
      if(flg) return i;
    }
    return -1;
}
//删除集合中的某个元素
function rmItem(collection,obj){
  let index =  findIndex(collection,obj);
  if(index>=0){
    collection.splice(index,1);
  }
}
//函数防抖 (lodash)
function debounce(func, wait, immediate) {
    // immediate默认为false
    var timeout, args, context, timestamp, result;
    var later = function() {
      // 当wait指定的时间间隔期间多次调用debounce返回的函数，则会不断更新timestamp的值，导致last < wait && last >= 0一直为true，从而不断启动新的计时器延时执行func
      var last = Date.now() - timestamp;

      if (last < wait && last >= 0) {
        timeout = setTimeout(later, wait - last);
      } else {
        timeout = null;
        if (!immediate) {
          result = func.apply(context, args);
          if (!timeout) context = args = null;
        }
      }
    };

    return function() {
      context = this;
      args = arguments;
      timestamp = Date.now();
      // 第一次调用该方法时，且immediate为true，则调用func函数
      var callNow = immediate && !timeout;
      // 在wait指定的时间间隔内首次调用该方法，则启动计时器定时调用func函数
      if (!timeout) timeout = setTimeout(later, wait);
      if (callNow) {
        result = func.apply(context, args);
        context = args = null;
      }

      return result;
    };
  };

//日期格式化
function formatDate(input,fmt='yyyy-MM-dd'){
  let date = input;
  if(typeof(date)=='string'){
      if(/^\d{9,}$/.test(date)){
          date = new Date(parseInt(date));
      }else{
          date = date.replace(/\-/g,'\/')//兼容ios日期 new Date bug
          if(!/\d+(\/|\s)\d+(\/|\s)\d+/.test(date)) return '';
          date = new Date(date);
      }
  }
  if(typeof(date)=='number') date = new Date(date);
  if(date=='Invalid Date' || !date) return date;
  //console.log(date)
  var o = {
      "M+": date.getMonth() + 1, //月份 
      "d+": date.getDate(), //日 
      "h+": date.getHours(), //小时 
      "m+": date.getMinutes(), //分 
      "s+": date.getSeconds(), //秒 
      "q+": Math.floor((date.getMonth() + 3) / 3), //季度 
      "S": date.getMilliseconds() //毫秒 
  };
  if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
  for (var k in o)
  if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  return fmt;
}
function formatGender(str){
  switch(str){
    case 'M':
    return '男';
    case 'F':
    return '女';
    default:
    return '未知';

  }
}


//这里导出模块，包括filter 用的一些模块，
//有些场景filter可能不适用，所以把这些共用部分抽出来
//必要时可以替代filter
export {
    isArray,
    deepCopy,
    findIndex,
    debounce,
    formatDate,
    formatGender
}